package util;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Real {
	@Override
	public boolean equals(Object arg0) {
		return valor.equals(((Real) arg0).getValor());
	}

	BigDecimal valor;

	/**
	 * Rounding mode especificado soh sera usado na construcao. Todas as outras
	 * operacoes continurao usando RoundinMode.DOWN
	 * 
	 * @param arg
	 * @param roundingMode
	 */
	public Real(String arg, RoundingMode roundingMode) {
		valor = new BigDecimal(arg).setScale(2, roundingMode);
	}

	/**
	 * Rounding mode especificado soh sera usado na construcao. Todas as outras
	 * operacoes continurao usando RoundinMode.DOWN
	 * 
	 * @param arg
	 * @param roundingMode
	 */
	public Real(double d, RoundingMode roundingMode) {
		valor = new BigDecimal(d).setScale(2, roundingMode);
	}

	public Real(String arg0) {
		valor = new BigDecimal(arg0).setScale(2, RoundingMode.DOWN);
	}

	public Real(BigDecimal decimal) {
		valor = decimal.setScale(2, RoundingMode.DOWN);
	}

	public Real(double d) {
		valor = new BigDecimal(d).setScale(2, RoundingMode.DOWN);
	}

	public String toString() {
		return valor.toString();
	}

	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {
		Real preco = new Real(StdinReader.getString());
		System.out.println(preco);
	}

	public BigDecimal getValor() {
		return valor;
	}

	public Real divide(Real outro) {
		return new Real(valor.divide(outro.getValor(), 2, RoundingMode.DOWN));
	}

	public Real divide(BigDecimal outro) {
		return new Real(valor.divide(outro,2,RoundingMode.DOWN));
	}

	public Real multiply(BigDecimal outro) {
		return new Real(valor.multiply(outro));

	}

	public Real subtract(Real outro) {
		return new Real(valor.subtract(outro.getValor()));
	}

	public Real subtract(BigDecimal outro) {
		return new Real(valor.subtract(outro));
	}

	public Real add(Real outro) {
		return new Real(valor.add(outro.getValor()));
	}

	public int compareTo(Real precoFinal) {
		return valor.compareTo(precoFinal.getValor());
	}

	public Real add(BigDecimal outro) {
		return new Real(valor.add(outro));
	}

	public Real abs() {
		return new Real(valor.abs());
	}

	public double doubleValue() {
		return valor.doubleValue();
	}
}
